package aplicacionCliente;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import api.Dispositivo;
import api.Regla;

public class VistaCliente  extends JFrame implements MouseListener,ActionListener{
	//Componentes del panelReglas
	private DefaultListModel modelListReglas;
	private JList listReglas;
	private String reglaActual;	
	private String servidorRemoto;
	private JLabel estadoRegla;
	
	private ManejadorDatos manejadorDatos;
	
	public VistaCliente(String servidor){
		super("Cliente");
		this.servidorRemoto = servidor;
		this.manejadorDatos = new ManejadorDatos(this.servidorRemoto);
		setPanelPrincipal();
		agregarPanelReglas();
		this.pack();
		this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
	}
	
	private void setPanelPrincipal() {
		JPanel panelPrincipal = new JPanel();
		panelPrincipal.setLayout(new GridBagLayout());
		this.setContentPane(panelPrincipal);
	}
	
	private void cargarReglas(){
		Iterator<String> it = this.manejadorDatos.getInformacionReglas().iterator(); 
		while (it.hasNext()){
			modelListReglas.addElement(it.next());
		}
	}
	
	private int getIdRegla(String regla){
		String[] splitRegla = regla.split(" - ");
		return (Integer.parseInt(splitRegla[0]));
	}
	
	private void activarRegla(int i){
		this.manejadorDatos.activarRegla(i);
	}
	
	private void desactivarRegla(int i){
		this.manejadorDatos.desactivarRegla(i);
	}
	
	private boolean estadoRegla(int i){
		return this.manejadorDatos.reglaActiva(i);
	}
	
	public void agregarPanelReglas() {
		JPanel panelReglas = new JPanel();
		panelReglas.setLayout(new GridBagLayout());
		
		//JLabel para la lista de reglas
		JLabel labelLReglas = new JLabel("Reglas existentes:");
		
		//JLabel para indicar estado de regla
		//TODO: falta hacer funcionar
		this.estadoRegla = new JLabel();
		
		//Botones de accion sobre reglas
		//JButton para activar una regla
		JButton activarRegla = new JButton("Activar Regla"){
			//Pongo que hacer cuando se hace clic
			protected void processMouseEvent(MouseEvent event){
				if (event.getID() == MouseEvent.MOUSE_CLICKED){
					this.doClick();
					if ((reglaActual != null) && 
						!(estadoRegla(getIdRegla(reglaActual)))) {
						activarRegla(getIdRegla(reglaActual));
						estadoRegla.setText("Regla Activa");
					}
				}
			}
		};
		
		//JButton para desactivar una regla
		JButton desactivarRegla = new JButton("Desactivar Regla"){
			//Pongo que hacer cuando se hace clic
			protected void processMouseEvent(MouseEvent event){
				if (event.getID() == MouseEvent.MOUSE_CLICKED){
					this.doClick();
					if ((reglaActual != null) && 
							(estadoRegla(getIdRegla(reglaActual)))) {
							desactivarRegla(getIdRegla(reglaActual));
							estadoRegla.setText("Regla Inactiva");
						}
				}
			}		
		};		
		
		//Lista para poner las reglas que ya existen
		this.modelListReglas = new DefaultListModel(); 
		this.listReglas = new JList(modelListReglas);
		this.listReglas.addMouseListener(this);
		
		this.cargarReglas();

		//Agrego los componentes al panelReglas
		GridBagConstraints con = new GridBagConstraints();
		con.anchor = GridBagConstraints.CENTER;
		con.gridy = 0;
		con.gridx = 0;
		panelReglas.add(labelLReglas,con);
		
		con.gridy = 1;
		con.gridx = 0;
		con.gridheight = 3;
		JScrollPane scrollPane = new JScrollPane(listReglas);
		scrollPane.setPreferredSize(new Dimension(400,150));		
		panelReglas.add(scrollPane,con);
		
		con.anchor = GridBagConstraints.NORTH;
		con.gridheight = 1;
		con.gridy = 1;
		con.gridx = 1;
		panelReglas.add(activarRegla,con);
		
		con.gridy = 2;
		con.gridx = 1;
		panelReglas.add(desactivarRegla,con);
		
		con.anchor = GridBagConstraints.NORTH;
		con.gridy = 3;
		con.gridx = 1;
		panelReglas.add(estadoRegla,con);
		
		//Agrego el panel a la ventana
		con.gridx = 0;
		con.gridy = 2;		
		this.getContentPane().add(panelReglas,con);
	}
	
	public void mouseClicked(MouseEvent arg0) {
		if (arg0.getID() == MouseEvent.MOUSE_CLICKED){
			if (this.listReglas.getComponentCount() > 0){ 
				if (this.estadoRegla(this.getIdRegla(this.listReglas.getSelectedValue().toString()))) this.estadoRegla.setText("ReglaActiva");
				else this.estadoRegla.setText("Regla Inactiva");			
			}
		}
		this.pack();
	}
	public void mouseEntered(MouseEvent arg0) {}
	public void mouseExited(MouseEvent arg0) {}
	public void mousePressed(MouseEvent arg0) {}
	public void mouseReleased(MouseEvent arg0) {}
	public void actionPerformed(ActionEvent arg0) {}
}
